123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671 |
- /*=========================================================================
- 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.commontk.org/LICENSE
- 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 <QModelIndex>
- #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 "ctkDICOMImportWidget.h"
- #include "ctkDICOMThumbnailGenerator.h"
- #include "ctkThumbnailWidget.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");
- //----------------------------------------------------------------------------
- class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
- {
- public:
- ctkDICOMAppWidget* const q_ptr;
- Q_DECLARE_PUBLIC(ctkDICOMAppWidget);
- ctkDICOMAppWidgetPrivate(ctkDICOMAppWidget* );
- ctkFileDialog* ImportDialog;
- ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
- QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
- QSharedPointer<ctkDICOMThumbnailGenerator> ThumbnailGenerator;
- ctkDICOMModel DICOMModel;
- ctkDICOMFilterProxyModel DICOMProxyModel;
- QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
- 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);
- DICOMIndexer->setThumbnailGenerator(ThumbnailGenerator.data());
- }
- //----------------------------------------------------------------------------
- // 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->setThumbnailWidth(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(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->TreeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onModelSelected(const QModelIndex &)));
- connect(d->ThumbnailsWidget, SIGNAL(selected(const ctkThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkThumbnailWidget&)));
- connect(d->ThumbnailsWidget, SIGNAL(doubleClicked(const ctkThumbnailWidget&)), this, SLOT(onThumbnailDoubleClicked(const ctkThumbnailWidget&)));
- connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
- connect(d->QueryRetrieveWidget, SIGNAL( canceled() ), d->QueryRetrieveWidget, SLOT( hide() ) );
- 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::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->DICOMModel.setDisplayLevel(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();
- }
- //----------------------------------------------------------------------------
- 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::onThumbnailSelected(const ctkThumbnailWidget& widget)
- {
- Q_D(ctkDICOMAppWidget);
- d->ImagePreview->onModelSelected(widget.sourceIndex());
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::onThumbnailDoubleClicked(const ctkThumbnailWidget& widget)
- {
- Q_D(ctkDICOMAppWidget);
- QModelIndex index = widget.sourceIndex();
- 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->isEnabled())
- {
- targetDirectory = d->DICOMDatabase->databaseDirectory();
- }
- d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
- d->DICOMModel.reset();
- }
- }
- //----------------------------------------------------------------------------
- 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();
- }
- }
- else
- {
- d->NextImageButton->hide();
- d->PrevImageButton->hide();
- d->NextSeriesButton->hide();
- d->PrevSeriesButton->hide();
- d->NextStudyButton->hide();
- d->PrevStudyButton->hide();
- }
- }
- //----------------------------------------------------------------------------
- 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->selectThumbnail(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->selectThumbnail(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->selectThumbnail(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->selectThumbnail(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->selectThumbnail(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->selectThumbnail(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->setThumbnailWidth(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->reset();
- 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();
- }
- }
|