| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915 | 
							- /*=========================================================================
 
-   Library:   CTK
 
-   Copyright (c) Kitware Inc.
 
-   Licensed under the Apache License, Version 2.0 (the "License");
 
-   you may not use this file except in compliance with the License.
 
-   You may obtain a copy of the License at
 
-       http://www.apache.org/licenses/LICENSE-2.0.txt
 
-   Unless required by applicable law or agreed to in writing, software
 
-   distributed under the License is distributed on an "AS IS" BASIS,
 
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-   See the License for the specific language governing permissions and
 
-   limitations under the License.
 
- =========================================================================*/
 
- // std includes
 
- #include <iostream>
 
- #include <dcmimage.h>
 
- // Qt includes
 
- #include <QAction>
 
- #include <QCheckBox>
 
- #include <QDebug>
 
- #include <QMetaType>
 
- #include <QModelIndex>
 
- #include <QPersistentModelIndex>
 
- #include <QProgressDialog>
 
- #include <QSettings>
 
- #include <QSlider>
 
- #include <QTabBar>
 
- #include <QTimer>
 
- #include <QTreeView>
 
- // ctkWidgets includes
 
- #include "ctkDirectoryButton.h"
 
- #include "ctkFileDialog.h"
 
- // ctkDICOMCore includes
 
- #include "ctkDICOMDatabase.h"
 
- #include "ctkDICOMFilterProxyModel.h"
 
- #include "ctkDICOMIndexer.h"
 
- #include "ctkDICOMModel.h"
 
- // ctkDICOMWidgets includes
 
- #include "ctkDICOMAppWidget.h"
 
- #include "ctkDICOMThumbnailGenerator.h"
 
- #include "ctkThumbnailLabel.h"
 
- #include "ctkDICOMQueryResultsTabWidget.h"
 
- #include "ctkDICOMQueryRetrieveWidget.h"
 
- #include "ctkDICOMQueryWidget.h"
 
- #include "ui_ctkDICOMAppWidget.h"
 
- //logger
 
- #include <ctkLogger.h>
 
- static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
 
- Q_DECLARE_METATYPE(QPersistentModelIndex);
 
- //----------------------------------------------------------------------------
 
- class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
 
- {
 
- public:
 
-   ctkDICOMAppWidget* const q_ptr;
 
-   Q_DECLARE_PUBLIC(ctkDICOMAppWidget);
 
-   ctkDICOMAppWidgetPrivate(ctkDICOMAppWidget* );
 
-   ~ctkDICOMAppWidgetPrivate();
 
-   ctkFileDialog* ImportDialog;
 
-   ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
 
-   QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
 
-   QSharedPointer<ctkDICOMThumbnailGenerator> ThumbnailGenerator;
 
-   ctkDICOMModel DICOMModel;
 
-   ctkDICOMFilterProxyModel DICOMProxyModel;
 
-   QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
 
-   QProgressDialog *IndexerProgress;
 
-   QProgressDialog *UpdateSchemaProgress;
 
-   void showIndexerDialog();
 
-   void showUpdateSchemaDialog();
 
-   // used when suspending the ctkDICOMModel
 
-   QSqlDatabase EmptyDatabase;
 
-   QTimer* AutoPlayTimer;
 
-   bool IsSearchWidgetPopUpMode;
 
- };
 
- //----------------------------------------------------------------------------
 
- // ctkDICOMAppWidgetPrivate methods
 
- ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(ctkDICOMAppWidget* parent): q_ptr(parent){
 
-   DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
 
-   ThumbnailGenerator = QSharedPointer <ctkDICOMThumbnailGenerator> (new ctkDICOMThumbnailGenerator);
 
-   DICOMDatabase->setThumbnailGenerator(ThumbnailGenerator.data());
 
-   DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
 
-   IndexerProgress = 0;
 
-   UpdateSchemaProgress = 0;
 
- }
 
- ctkDICOMAppWidgetPrivate::~ctkDICOMAppWidgetPrivate()
 
- {
 
-   if ( IndexerProgress )
 
-     {
 
-     delete IndexerProgress;
 
-     }
 
-   if ( UpdateSchemaProgress )
 
-     {
 
-     delete UpdateSchemaProgress;
 
-     }
 
- }
 
- void ctkDICOMAppWidgetPrivate::showUpdateSchemaDialog()
 
- {
 
-   Q_Q(ctkDICOMAppWidget);
 
-   if (UpdateSchemaProgress == 0)
 
-     {
 
-     //
 
-     // Set up the Update Schema Progress Dialog
 
-     //
 
-     UpdateSchemaProgress = new QProgressDialog(
 
-         q->tr("DICOM Schema Update"), "Cancel", 0, 100, q,
 
-          Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
 
-     // We don't want the progress dialog to resize itself, so we bypass the label
 
-     // by creating our own
 
-     QLabel* progressLabel = new QLabel(q->tr("Initialization..."));
 
-     UpdateSchemaProgress->setLabel(progressLabel);
 
- #ifdef Q_WS_MAC
 
-     // BUG: avoid deadlock of dialogs on mac
 
-     UpdateSchemaProgress->setWindowModality(Qt::NonModal);
 
- #else
 
-     UpdateSchemaProgress->setWindowModality(Qt::ApplicationModal);
 
- #endif
 
-     UpdateSchemaProgress->setMinimumDuration(0);
 
-     UpdateSchemaProgress->setValue(0);
 
-     //q->connect(UpdateSchemaProgress, SIGNAL(canceled()), 
 
-      //       DICOMIndexer.data(), SLOT(cancel()));
 
-     q->connect(DICOMDatabase.data(), SIGNAL(schemaUpdateStarted(int)),
 
-             UpdateSchemaProgress, SLOT(setMaximum(int)));
 
-     q->connect(DICOMDatabase.data(), SIGNAL(schemaUpdateProgress(int)),
 
-             UpdateSchemaProgress, SLOT(setValue(int)));
 
-     q->connect(DICOMDatabase.data(), SIGNAL(schemaUpdateProgress(QString)),
 
-             progressLabel, SLOT(setText(QString)));
 
-     // close the dialog
 
-     q->connect(DICOMDatabase.data(), SIGNAL(schemaUpdated()),
 
-             UpdateSchemaProgress, SLOT(close()));
 
-     // reset the database to show new data
 
-     q->connect(DICOMDatabase.data(), SIGNAL(schemaUpdated()),
 
-             &DICOMModel, SLOT(reset()));
 
-     // reset the database if canceled
 
-     q->connect(UpdateSchemaProgress, SIGNAL(canceled()), 
 
-             &DICOMModel, SLOT(reset()));
 
-     }
 
-   UpdateSchemaProgress->show();
 
- }
 
- void ctkDICOMAppWidgetPrivate::showIndexerDialog()
 
- {
 
-   Q_Q(ctkDICOMAppWidget);
 
-   if (IndexerProgress == 0)
 
-     {
 
-     //
 
-     // Set up the Indexer Progress Dialog
 
-     //
 
-     IndexerProgress = new QProgressDialog( q->tr("DICOM Import"), "Cancel", 0, 100, q,
 
-          Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
 
-     // We don't want the progress dialog to resize itself, so we bypass the label
 
-     // by creating our own
 
-     QLabel* progressLabel = new QLabel(q->tr("Initialization..."));
 
-     IndexerProgress->setLabel(progressLabel);
 
- #ifdef Q_WS_MAC
 
-     // BUG: avoid deadlock of dialogs on mac
 
-     IndexerProgress->setWindowModality(Qt::NonModal);
 
- #else
 
-     IndexerProgress->setWindowModality(Qt::ApplicationModal);
 
- #endif
 
-     IndexerProgress->setMinimumDuration(0);
 
-     IndexerProgress->setValue(0);
 
-     q->connect(IndexerProgress, SIGNAL(canceled()), 
 
-                  DICOMIndexer.data(), SLOT(cancel()));
 
-     q->connect(DICOMIndexer.data(), SIGNAL(progress(int)),
 
-             IndexerProgress, SLOT(setValue(int)));
 
-     q->connect(DICOMIndexer.data(), SIGNAL(indexingFilePath(QString)),
 
-             progressLabel, SLOT(setText(QString)));
 
-     // close the dialog
 
-     q->connect(DICOMIndexer.data(), SIGNAL(indexingComplete()),
 
-             IndexerProgress, SLOT(close()));
 
-     // reset the database to show new data
 
-     q->connect(DICOMIndexer.data(), SIGNAL(indexingComplete()),
 
-             &DICOMModel, SLOT(reset()));
 
-     // stop indexing and reset the database if canceled
 
-     q->connect(IndexerProgress, SIGNAL(canceled()), 
 
-             DICOMIndexer.data(), SLOT(cancel()));
 
-     q->connect(IndexerProgress, SIGNAL(canceled()), 
 
-             &DICOMModel, SLOT(reset()));
 
-     // allow users of this widget to know that the process has finished
 
-     q->connect(IndexerProgress, SIGNAL(canceled()), 
 
-             q, SIGNAL(directoryImported()));
 
-     q->connect(DICOMIndexer.data(), SIGNAL(indexingComplete()),
 
-             q, SIGNAL(directoryImported()));
 
-     }
 
-   IndexerProgress->show();
 
- }
 
- //----------------------------------------------------------------------------
 
- // ctkDICOMAppWidget methods
 
- //----------------------------------------------------------------------------
 
- ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
 
-     d_ptr(new ctkDICOMAppWidgetPrivate(this))
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->setupUi(this);
 
-   this->setSearchWidgetPopUpMode(false);
 
-   //Hide image previewer buttons
 
-   d->NextImageButton->hide();
 
-   d->PrevImageButton->hide();
 
-   d->NextSeriesButton->hide();
 
-   d->PrevSeriesButton->hide();
 
-   d->NextStudyButton->hide();
 
-   d->PrevStudyButton->hide();
 
-   //Enable sorting in tree view
 
-   d->TreeView->setSortingEnabled(true);
 
-   d->TreeView->setSelectionBehavior(QAbstractItemView::SelectRows);
 
-   d->DICOMProxyModel.setSourceModel(&d->DICOMModel);
 
-   d->TreeView->setModel(&d->DICOMModel);
 
-   d->ThumbnailsWidget->setThumbnailSize(
 
-     QSize(d->ThumbnailWidthSlider->value(), d->ThumbnailWidthSlider->value()));
 
-   connect(d->TreeView, SIGNAL(collapsed(QModelIndex)), this, SLOT(onTreeCollapsed(QModelIndex)));
 
-   connect(d->TreeView, SIGNAL(expanded(QModelIndex)), this, SLOT(onTreeExpanded(QModelIndex)));
 
-   //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(QString)), this, SLOT(setDatabaseDirectory(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(QModelIndex)), d->ThumbnailsWidget, SLOT(onModelSelected(QModelIndex)));
 
-   connect(d->TreeView, SIGNAL(clicked(QModelIndex)), d->ImagePreview, SLOT(onModelSelected(QModelIndex)));
 
-   connect(d->TreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(onModelSelected(QModelIndex)));
 
-   connect(d->ThumbnailsWidget, SIGNAL(selected(ctkThumbnailLabel)), this, SLOT(onThumbnailSelected(ctkThumbnailLabel)));
 
-   connect(d->ThumbnailsWidget, SIGNAL(doubleClicked(ctkThumbnailLabel)), this, SLOT(onThumbnailDoubleClicked(ctkThumbnailLabel)));
 
-   connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
 
-   connect(d->QueryRetrieveWidget, SIGNAL(canceled()), d->QueryRetrieveWidget, SLOT(hide()) );
 
-   connect(d->QueryRetrieveWidget, SIGNAL(canceled()), this, SLOT(onQueryRetrieveFinished()) );
 
-   connect(d->ImagePreview, SIGNAL(requestNextImage()), this, SLOT(onNextImage()));
 
-   connect(d->ImagePreview, SIGNAL(requestPreviousImage()), this, SLOT(onPreviousImage()));
 
-   connect(d->ImagePreview, SIGNAL(imageDisplayed(int,int)), this, SLOT(onImagePreviewDisplayed(int,int)));
 
-   connect(d->SearchOption, SIGNAL(parameterChanged()), this, SLOT(onSearchParameterChanged()));
 
-   connect(d->PlaySlider, SIGNAL(valueChanged(int)), d->ImagePreview, SLOT(displayImage(int)));
 
- }
 
- //----------------------------------------------------------------------------
 
- ctkDICOMAppWidget::~ctkDICOMAppWidget()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->QueryRetrieveWidget->deleteLater();
 
-   d->ImportDialog->deleteLater();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::updateDatabaseSchemaIfNeeded()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->showUpdateSchemaDialog();
 
-   d->DICOMDatabase->updateSchemaIfNeeded();
 
- }
 
- //----------------------------------------------------------------------------
 
- 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;
 
-     }
 
-   // update the database schema if needed and provide progress
 
-   this->updateDatabaseSchemaIfNeeded();
 
-   d->DICOMModel.setDatabase(d->DICOMDatabase->database());
 
-   d->DICOMModel.setEndLevel(ctkDICOMModel::SeriesType);
 
-   d->TreeView->resizeColumnToContents(0);
 
-   //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();
 
- }
 
- //----------------------------------------------------------------------------
 
- bool ctkDICOMAppWidget::searchWidgetPopUpMode(){
 
-   Q_D(ctkDICOMAppWidget);
 
-   return d->IsSearchWidgetPopUpMode;
 
- }
 
- //------------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::setTagsToPrecache( const QStringList tags)
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->DICOMDatabase->setTagsToPrecache(tags);
 
- }
 
- //------------------------------------------------------------------------------
 
- const QStringList ctkDICOMAppWidget::tagsToPrecache()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   return d->DICOMDatabase->tagsToPrecache();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::setSearchWidgetPopUpMode(bool flag){
 
-   Q_D(ctkDICOMAppWidget);
 
-   if(flag)
 
-     {
 
-     d->SearchDockWidget->setTitleBarWidget(0);
 
-     d->SearchPopUpButton->show();
 
-     d->SearchDockWidget->hide();
 
-     d->SearchDockWidget->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
 
-     connect(d->SearchDockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(onSearchWidgetTopLevelChanged(bool)));
 
-     connect(d->SearchPopUpButton, SIGNAL(clicked()), this, SLOT(onSearchPopUpButtonClicked()));
 
-     }
 
-   else
 
-     {
 
-     d->SearchDockWidget->setTitleBarWidget(new QWidget());
 
-     d->SearchPopUpButton->hide();
 
-     d->SearchDockWidget->show();
 
-     d->SearchDockWidget->setFeatures(QDockWidget::NoDockWidgetFeatures);
 
-     disconnect(d->SearchDockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(onSearchWidgetTopLevelChanged(bool)));
 
-     disconnect(d->SearchPopUpButton, SIGNAL(clicked()), this, SLOT(onSearchPopUpButtonClicked()));
 
-     }
 
-   d->IsSearchWidgetPopUpMode = flag;
 
- }
 
- //----------------------------------------------------------------------------
 
- 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::onQueryRetrieveFinished()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->DICOMModel.reset();
 
-   emit this->queryRetrieveFinished();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onRemoveAction()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   //d->QueryRetrieveWidget->show();
 
-   // d->QueryRetrieveWidget->raise();
 
-   std::cout << "on remove" << std::endl;
 
-   QModelIndexList selection = d->TreeView->selectionModel()->selectedIndexes();
 
-   std::cout << selection.size() << std::endl;
 
-   QModelIndex index;
 
-   foreach(index,selection)
 
-   {
 
-     QModelIndex index0 = index.sibling(index.row(), 0);
 
-     if ( d->DICOMModel.data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType))
 
-     {
 
-       QString seriesUID = d->DICOMModel.data(index0,ctkDICOMModel::UIDRole).toString();
 
-       d->DICOMDatabase->removeSeries(seriesUID);
 
-     }
 
-     else if ( d->DICOMModel.data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType))
 
-     {
 
-       QString studyUID = d->DICOMModel.data(index0,ctkDICOMModel::UIDRole).toString();
 
-       d->DICOMDatabase->removeStudy(studyUID);
 
-     }
 
-     else if ( d->DICOMModel.data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType))
 
-     {
 
-       QString patientUID = d->DICOMModel.data(index0,ctkDICOMModel::UIDRole).toString();
 
-       d->DICOMDatabase->removePatient(patientUID);
 
-     }
 
-   }
 
-   d->DICOMModel.reset();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::suspendModel()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->DICOMModel.setDatabase(d->EmptyDatabase);
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::resumeModel()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->DICOMModel.setDatabase(d->DICOMDatabase->database());
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::resetModel()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->DICOMModel.reset();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onThumbnailSelected(const ctkThumbnailLabel& widget)
 
- {
 
-     Q_D(ctkDICOMAppWidget);
 
-   QModelIndex index = widget.property("sourceIndex").value<QPersistentModelIndex>();
 
-   if(index.isValid())
 
-     {
 
-     d->ImagePreview->onModelSelected(index);
 
-     }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onThumbnailDoubleClicked(const ctkThumbnailLabel& widget)
 
- {
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex index = widget.property("sourceIndex").value<QPersistentModelIndex>();
 
-     if(!index.isValid())
 
-       {
 
-       return;
 
-       }
 
-     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
-     QModelIndex index0 = index.sibling(index.row(), 0);
 
-     if(model && (model->data(index0,ctkDICOMModel::TypeRole) != static_cast<int>(ctkDICOMModel::ImageType)))
 
-       {
 
-         this->onModelSelected(index0);
 
-         d->TreeView->setCurrentIndex(index0);
 
-         d->ThumbnailsWidget->onModelSelected(index0);
 
-         d->ImagePreview->onModelSelected(index0);
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onImportDirectory(QString directory)
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   if (QDir(directory).exists())
 
-     {
 
-     QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
 
-     QString targetDirectory;
 
-     if (copyOnImport->checkState() == Qt::Checked)
 
-       {
 
-       targetDirectory = d->DICOMDatabase->databaseDirectory();
 
-       }
 
-     d->showIndexerDialog();
 
-     d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
 
-   }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onModelSelected(const QModelIndex &index){
 
- Q_D(ctkDICOMAppWidget);
 
-     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
-     if(model)
 
-       {
 
-         QModelIndex index0 = index.sibling(index.row(), 0);
 
-         if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType) )
 
-           {
 
-           d->NextImageButton->show();
 
-           d->PrevImageButton->show();
 
-           d->NextSeriesButton->show();
 
-           d->PrevSeriesButton->show();
 
-           d->NextStudyButton->show();
 
-           d->PrevStudyButton->show();
 
-           }
 
-         else if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType) )
 
-           {
 
-           d->NextImageButton->show();
 
-           d->PrevImageButton->show();
 
-           d->NextSeriesButton->show();
 
-           d->PrevSeriesButton->show();
 
-           d->NextStudyButton->hide();
 
-           d->PrevStudyButton->hide();
 
-           }
 
-         else if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType) )
 
-           {
 
-           d->NextImageButton->show();
 
-           d->PrevImageButton->show();
 
-           d->NextSeriesButton->hide();
 
-           d->PrevSeriesButton->hide();
 
-           d->NextStudyButton->hide();
 
-           d->PrevStudyButton->hide();
 
-           }
 
-         else
 
-           {
 
-           d->NextImageButton->hide();
 
-           d->PrevImageButton->hide();
 
-           d->NextSeriesButton->hide();
 
-           d->PrevSeriesButton->hide();
 
-           d->NextStudyButton->hide();
 
-           d->PrevStudyButton->hide();
 
-           }
 
-         d->ActionRemove->setEnabled(
 
-             model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType) ||
 
-             model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType) ||
 
-             model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType) );
 
-         }
 
-       else
 
-         {
 
-         d->NextImageButton->hide();
 
-         d->PrevImageButton->hide();
 
-         d->NextSeriesButton->hide();
 
-         d->PrevSeriesButton->hide();
 
-         d->NextStudyButton->hide();
 
-         d->PrevStudyButton->hide();
 
-         d->ActionRemove->setEnabled(false);
 
-         }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onNextImage(){
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex currentIndex = d->ImagePreview->currentImageIndex();
 
-     if(currentIndex.isValid())
 
-       {
 
-       ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-       if(model)
 
-         {
 
-         QModelIndex seriesIndex = currentIndex.parent();
 
-         int imageCount = model->rowCount(seriesIndex);
 
-         int imageID = currentIndex.row();
 
-         imageID = (imageID+1)%imageCount;
 
-         int max = d->PlaySlider->maximum();
 
-         if(imageID > 0 && imageID < max)
 
-           {
 
-             d->PlaySlider->setValue(imageID);
 
-           }
 
-         QModelIndex nextIndex = currentIndex.sibling(imageID, 0);
 
-         d->ImagePreview->onModelSelected(nextIndex);
 
-         d->ThumbnailsWidget->selectThumbnailFromIndex(nextIndex);
 
-         }
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onPreviousImage(){
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex currentIndex = d->ImagePreview->currentImageIndex();
 
-     if(currentIndex.isValid())
 
-       {
 
-       ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-       if(model)
 
-         {
 
-         QModelIndex seriesIndex = currentIndex.parent();
 
-         int imageCount = model->rowCount(seriesIndex);
 
-         int imageID = currentIndex.row();
 
-         imageID--;
 
-         if(imageID < 0) imageID += imageCount;
 
-         int max = d->PlaySlider->maximum();
 
-         if(imageID > 0 && imageID < max)
 
-           {
 
-             d->PlaySlider->setValue(imageID);
 
-           }
 
-         QModelIndex prevIndex = currentIndex.sibling(imageID, 0);
 
-         d->ImagePreview->onModelSelected(prevIndex);
 
-         d->ThumbnailsWidget->selectThumbnailFromIndex(prevIndex);
 
-         }
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onNextSeries(){
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex currentIndex = d->ImagePreview->currentImageIndex();
 
-     if(currentIndex.isValid())
 
-       {
 
-       ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-       if(model)
 
-         {
 
-         QModelIndex seriesIndex = currentIndex.parent();
 
-         QModelIndex studyIndex = seriesIndex.parent();
 
-         int seriesCount = model->rowCount(studyIndex);
 
-         int seriesID = seriesIndex.row();
 
-         seriesID = (seriesID + 1)%seriesCount;
 
-         QModelIndex nextIndex = seriesIndex.sibling(seriesID, 0);
 
-         d->ImagePreview->onModelSelected(nextIndex);
 
-         d->ThumbnailsWidget->selectThumbnailFromIndex(nextIndex);
 
-         }
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onPreviousSeries(){
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex currentIndex = d->ImagePreview->currentImageIndex();
 
-     if(currentIndex.isValid())
 
-       {
 
-       ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-       if(model)
 
-         {
 
-         QModelIndex seriesIndex = currentIndex.parent();
 
-         QModelIndex studyIndex = seriesIndex.parent();
 
-         int seriesCount = model->rowCount(studyIndex);
 
-         int seriesID = seriesIndex.row();
 
-         seriesID--;
 
-         if(seriesID < 0) seriesID += seriesCount;
 
-         QModelIndex prevIndex = seriesIndex.sibling(seriesID, 0);
 
-         d->ImagePreview->onModelSelected(prevIndex);
 
-         d->ThumbnailsWidget->selectThumbnailFromIndex(prevIndex);
 
-         }
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onNextStudy(){
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex currentIndex = d->ImagePreview->currentImageIndex();
 
-     if(currentIndex.isValid())
 
-       {
 
-       ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-       if(model)
 
-         {
 
-         QModelIndex seriesIndex = currentIndex.parent();
 
-         QModelIndex studyIndex = seriesIndex.parent();
 
-         QModelIndex patientIndex = studyIndex.parent();
 
-         int studyCount = model->rowCount(patientIndex);
 
-         int studyID = studyIndex.row();
 
-         studyID = (studyID + 1)%studyCount;
 
-         QModelIndex nextIndex = studyIndex.sibling(studyID, 0);
 
-         d->ImagePreview->onModelSelected(nextIndex);
 
-         d->ThumbnailsWidget->selectThumbnailFromIndex(nextIndex);
 
-         }
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onPreviousStudy(){
 
-     Q_D(ctkDICOMAppWidget);
 
-     QModelIndex currentIndex = d->ImagePreview->currentImageIndex();
 
-     if(currentIndex.isValid())
 
-       {
 
-       ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-       if(model)
 
-         {
 
-         QModelIndex seriesIndex = currentIndex.parent();
 
-         QModelIndex studyIndex = seriesIndex.parent();
 
-         QModelIndex patientIndex = studyIndex.parent();
 
-         int studyCount = model->rowCount(patientIndex);
 
-         int studyID = studyIndex.row();
 
-         studyID--;
 
-         if(studyID < 0) studyID += studyCount;
 
-         QModelIndex prevIndex = studyIndex.sibling(studyID, 0);
 
-         d->ImagePreview->onModelSelected(prevIndex);
 
-         d->ThumbnailsWidget->selectThumbnailFromIndex(prevIndex);
 
-         }
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onTreeCollapsed(const QModelIndex &index){
 
-     Q_UNUSED(index);
 
-     Q_D(ctkDICOMAppWidget);
 
-     d->TreeView->resizeColumnToContents(0);
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onTreeExpanded(const QModelIndex &index){
 
-     Q_UNUSED(index);
 
-     Q_D(ctkDICOMAppWidget);
 
-     d->TreeView->resizeColumnToContents(0);
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onAutoPlayCheckboxStateChanged(int state){
 
-     Q_D(ctkDICOMAppWidget);
 
-     if(state == 0) //OFF
 
-       {
 
-       disconnect(d->AutoPlayTimer, SIGNAL(timeout()), this, SLOT(onAutoPlayTimer()));
 
-       d->AutoPlayTimer->deleteLater();
 
-       }
 
-     else if(state == 2) //ON
 
-       {
 
-       d->AutoPlayTimer = new QTimer(this);
 
-       connect(d->AutoPlayTimer, SIGNAL(timeout()), this, SLOT(onAutoPlayTimer()));
 
-       d->AutoPlayTimer->start(50);
 
-       }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onAutoPlayTimer(){
 
-     this->onNextImage();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onThumbnailWidthSliderValueChanged(int val){
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->ThumbnailsWidget->setThumbnailSize(QSize(val, val));
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onSearchParameterChanged(){
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->DICOMModel.setDatabase(d->DICOMDatabase->database(), d->SearchOption->parameters());
 
-   this->onModelSelected(d->DICOMModel.index(0,0));
 
-   d->ThumbnailsWidget->clearThumbnails();
 
-   d->ThumbnailsWidget->onModelSelected(d->DICOMModel.index(0,0));
 
-   d->ImagePreview->clearImages();
 
-   d->ImagePreview->onModelSelected(d->DICOMModel.index(0,0));
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onImagePreviewDisplayed(int imageID, int count){
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->PlaySlider->setMinimum(0);
 
-   d->PlaySlider->setMaximum(count-1);
 
-   d->PlaySlider->setValue(imageID);
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onSearchPopUpButtonClicked(){
 
-   Q_D(ctkDICOMAppWidget);
 
-   if(d->SearchDockWidget->isFloating())
 
-     {
 
-     d->SearchDockWidget->hide();
 
-     d->SearchDockWidget->setFloating(false);
 
-     }
 
-   else
 
-     {
 
-     d->SearchDockWidget->setFloating(true);
 
-     d->SearchDockWidget->adjustSize();
 
-     d->SearchDockWidget->show();
 
-     }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onSearchWidgetTopLevelChanged(bool topLevel){
 
-   Q_D(ctkDICOMAppWidget);
 
-   if(topLevel)
 
-     {
 
-     d->SearchDockWidget->show();
 
-     }
 
-   else
 
-     {
 
-     d->SearchDockWidget->hide();
 
-     }
 
- }
 
 
  |